/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidade.persistencia;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.apache.commons.codec.binary.Base64;

/**
 *
 * @author victorinox
 */
@Entity
@Table(name = "produto", catalog = "carlossa03", schema = "")
@NamedQueries({@NamedQuery(name = "Produto.findAll", query = "SELECT p FROM Produto p"), @NamedQuery(name = "Produto.findByProdutoId", query = "SELECT p FROM Produto p WHERE p.produtoId = :produtoId"), @NamedQuery(name = "Produto.findByNome", query = "SELECT p FROM Produto p WHERE p.nome = :nome"), @NamedQuery(name = "Produto.findByVisivelVitrine", query = "SELECT p FROM Produto p WHERE p.visivelVitrine = :visivelVitrine"), @NamedQuery(name = "Produto.findByPesoVitrine", query = "SELECT p FROM Produto p WHERE p.pesoVitrine = :pesoVitrine"), @NamedQuery(name = "Produto.findByQuantidadeEstoque", query = "SELECT p FROM Produto p WHERE p.quantidadeEstoque = :quantidadeEstoque"), @NamedQuery(name = "Produto.findByPrecoUnitarioProposto", query = "SELECT p FROM Produto p WHERE p.precoUnitarioProposto = :precoUnitarioProposto"), @NamedQuery(name = "Produto.findByIsVirtual", query = "SELECT p FROM Produto p WHERE p.isVirtual = :isVirtual"), @NamedQuery(name = "Produto.findByVirtualDataEntrega", query = "SELECT p FROM Produto p WHERE p.virtualDataEntrega = :virtualDataEntrega"), @NamedQuery(name = "Produto.findByIsCrossDocking", query = "SELECT p FROM Produto p WHERE p.isCrossDocking = :isCrossDocking"), @NamedQuery(name = "Produto.findByCrossDockingDataEntrega", query = "SELECT p FROM Produto p WHERE p.crossDockingDataEntrega = :crossDockingDataEntrega"), @NamedQuery(name = "Produto.findByPesoKg", query = "SELECT p FROM Produto p WHERE p.pesoKg = :pesoKg"), @NamedQuery(name = "Produto.findByLargura", query = "SELECT p FROM Produto p WHERE p.largura = :largura"), @NamedQuery(name = "Produto.findByProfundidade", query = "SELECT p FROM Produto p WHERE p.profundidade = :profundidade"), @NamedQuery(name = "Produto.findByAltura", query = "SELECT p FROM Produto p WHERE p.altura = :altura"), @NamedQuery(name = "Produto.findByDataUltimaAlteracao", query = "SELECT p FROM Produto p WHERE p.dataUltimaAlteracao = :dataUltimaAlteracao")})
public class Produto implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "produto_id")
    private Integer produtoId;
    @Basic(optional = false)
    @Column(name = "nome")
    private String nome;
    @Basic(optional = false)
    @Lob
    @Column(name = "descricao")
    private String descricao;
    @Basic(optional = false)
    @Lob
    @Column(name = "ficha_externa")
    private String fichaExterna;
    @Basic(optional = false)
    @Lob
    @Column(name = "ficha_tecnica")
    private String fichaTecnica;
    @Basic(optional = false)
    @Column(name = "visivel_vitrine")
    private boolean visivelVitrine;
    @Basic(optional = false)
    @Column(name = "peso_vitrine")
    private int pesoVitrine;
    @Lob
    @Column(name = "imagem")
    private byte[] imagem;
    @Column(name = "quantidade_estoque")
    private Integer quantidadeEstoque;
    @Column(name = "preco_unitario_proposto")
    private Float precoUnitarioProposto;
    @Lob
    @Column(name = "descricao_produto_particionado")
    private String descricaoProdutoParticionado;
    @Basic(optional = false)
    @Column(name = "is_virtual")
    private boolean isVirtual;
    @Column(name = "virtual_data_entrega")
    @Temporal(TemporalType.DATE)
    private Date virtualDataEntrega;
    @Basic(optional = false)
    @Column(name = "is_cross_docking")
    private boolean isCrossDocking;
    @Column(name = "cross_docking_data_entrega")
    @Temporal(TemporalType.DATE)
    private Date crossDockingDataEntrega;
    @Column(name = "peso_kg")
    private Integer pesoKg;
    @Column(name = "largura")
    private Float largura;
    @Column(name = "profundidade")
    private Float profundidade;
    @Column(name = "altura")
    private Float altura;
    @Column(name = "data_ultima_alteracao")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataUltimaAlteracao;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produtoId", fetch = FetchType.LAZY)
    private List<ProdutoNumeroSerie> produtoNumeroSerieCollection;
    @JoinColumn(name = "categoria_id", referencedColumnName = "categoria_id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private CategoriaProduto categoriaId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produto", fetch = FetchType.LAZY)
    private List<ProdutoVenda> produtoVendaCollection;
    @OneToMany(mappedBy = "produtoId", fetch = FetchType.LAZY)
    private List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produto", fetch = FetchType.LAZY)
    private List<ProdutoManutencao> produtoManutencaoCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "produto", fetch = FetchType.LAZY)
    private List<ProdutoCompra> produtoCompraCollection;

    public Produto() {
    }

    public Produto(Integer produtoId) {
        this.produtoId = produtoId;
    }

    public Produto(Integer produtoId, String nome, String descricao, String fichaExterna, String fichaTecnica, boolean visivelVitrine, int pesoVitrine, boolean isVirtual, boolean isCrossDocking) {
        this.produtoId = produtoId;
        this.nome = nome;
        this.descricao = descricao;
        this.fichaExterna = fichaExterna;
        this.fichaTecnica = fichaTecnica;
        this.visivelVitrine = visivelVitrine;
        this.pesoVitrine = pesoVitrine;
        this.isVirtual = isVirtual;
        this.isCrossDocking = isCrossDocking;
    }

    public Integer getProdutoId() {
        return produtoId;
    }

    public void setProdutoId(Integer produtoId) {
        this.produtoId = produtoId;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getFichaExterna() {
        return fichaExterna;
    }

    public void setFichaExterna(String fichaExterna) {
        this.fichaExterna = fichaExterna;
    }

    public String getFichaTecnica() {
        return fichaTecnica;
    }

    public void setFichaTecnica(String fichaTecnica) {
        this.fichaTecnica = fichaTecnica;
    }

    public boolean getVisivelVitrine() {
        return visivelVitrine;
    }

    public void setVisivelVitrine(boolean visivelVitrine) {
        this.visivelVitrine = visivelVitrine;
    }

    public int getPesoVitrine() {
        return pesoVitrine;
    }

    public void setPesoVitrine(int pesoVitrine) {
        this.pesoVitrine = pesoVitrine;
    }

    public byte[] getImagem() {
        return imagem;
    }

    public void setImagem(byte[] imagem) {
        this.imagem = imagem;
    }

    public Integer getQuantidadeEstoque() {
        return quantidadeEstoque;
    }

    public void setQuantidadeEstoque(Integer quantidadeEstoque) {
        this.quantidadeEstoque = quantidadeEstoque;
    }

    public Float getPrecoUnitarioProposto() {
        return precoUnitarioProposto;
    }

    public void setPrecoUnitarioProposto(Float precoUnitarioProposto) {
        this.precoUnitarioProposto = precoUnitarioProposto;
    }

    public String getDescricaoProdutoParticionado() {
        return descricaoProdutoParticionado;
    }

    public void setDescricaoProdutoParticionado(String descricaoProdutoParticionado) {
        this.descricaoProdutoParticionado = descricaoProdutoParticionado;
    }

    public boolean getIsVirtual() {
        return isVirtual;
    }

    public void setIsVirtual(boolean isVirtual) {
        this.isVirtual = isVirtual;
    }

    public Date getVirtualDataEntrega() {
        if (virtualDataEntrega == null) {
            virtualDataEntrega = new Date();
        }
        return virtualDataEntrega;
    }

    public void setVirtualDataEntrega(Date virtualDataEntrega) {
        this.virtualDataEntrega = virtualDataEntrega;
    }

    public boolean getIsCrossDocking() {
        return isCrossDocking;
    }

    public void setIsCrossDocking(boolean isCrossDocking) {
        this.isCrossDocking = isCrossDocking;
    }

    public Date getCrossDockingDataEntrega() {
        if (crossDockingDataEntrega == null) {
            crossDockingDataEntrega = new Date();
        }
        return crossDockingDataEntrega;
    }

    public void setCrossDockingDataEntrega(Date crossDockingDataEntrega) {
        this.crossDockingDataEntrega = crossDockingDataEntrega;
    }

    public Integer getPesoKg() {
        return pesoKg;
    }

    public void setPesoKg(Integer pesoKg) {
        this.pesoKg = pesoKg;
    }

    public Float getLargura() {
        return largura;
    }

    public void setLargura(Float largura) {
        this.largura = largura;
    }

    public Float getProfundidade() {
        return profundidade;
    }

    public void setProfundidade(Float profundidade) {
        this.profundidade = profundidade;
    }

    public Float getAltura() {
        return altura;
    }

    public void setAltura(Float altura) {
        this.altura = altura;
    }

    public Date getDataUltimaAlteracao() {
        return dataUltimaAlteracao;
    }

    public void setDataUltimaAlteracao(Date dataUltimaAlteracao) {
        this.dataUltimaAlteracao = dataUltimaAlteracao;
    }

    public List<ProdutoNumeroSerie> getProdutoNumeroSerieCollection() {
        return produtoNumeroSerieCollection;
    }

    public void setProdutoNumeroSerieCollection(List<ProdutoNumeroSerie> produtoNumeroSerieCollection) {
        this.produtoNumeroSerieCollection = produtoNumeroSerieCollection;
    }

    public CategoriaProduto getCategoriaId() {
        return categoriaId;
    }

    public void setCategoriaId(CategoriaProduto categoriaId) {
        this.categoriaId = categoriaId;
    }

    public List<ProdutoVenda> getProdutoVendaCollection() {
        return produtoVendaCollection;
    }

    public void setProdutoVendaCollection(List<ProdutoVenda> produtoVendaCollection) {
        this.produtoVendaCollection = produtoVendaCollection;
    }

    public List<ReparoProdutoNumeroSerie> getReparoProdutoNumeroSerieCollection() {
        return reparoProdutoNumeroSerieCollection;
    }

    public void setReparoProdutoNumeroSerieCollection(List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollection) {
        this.reparoProdutoNumeroSerieCollection = reparoProdutoNumeroSerieCollection;
    }

    public List<ProdutoManutencao> getProdutoManutencaoCollection() {
        return produtoManutencaoCollection;
    }

    public void setProdutoManutencaoCollection(List<ProdutoManutencao> produtoManutencaoCollection) {
        this.produtoManutencaoCollection = produtoManutencaoCollection;
    }

    public List<ProdutoCompra> getProdutoCompraCollection() {
        return produtoCompraCollection;
    }

    public void setProdutoCompraCollection(List<ProdutoCompra> produtoCompraCollection) {
        this.produtoCompraCollection = produtoCompraCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (produtoId != null ? produtoId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Produto)) {
            return false;
        }
        Produto other = (Produto) object;
        if ((this.produtoId == null && other.produtoId != null) || (this.produtoId != null && !this.produtoId.equals(other.produtoId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return getNome();
    }
}
